﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Fintech.Utils;
using ZOVNP.Model.Abstracts;

namespace ZOVNP.Engine
{
    /// <summary> Менеджер различных настроек программы. </summary>
    //internal class SettingsManager : ISettingsManager
    //{
    //    #region Поля

    //    private readonly ZOVNPEngine engine;
    //    /// <summary> Общесистемные настройки. </summary>
    //    private readonly LazyLoader<ISettingCollection> systemSettings;
    //    /// <summary> Настройки пользователя. </summary>
    //    private readonly LazyLoader<ISettingCollection> currentUserSettings;
    //    /// <summary> Настройки (свойства) окружения. </summary>
    //    private readonly EnvironmentSettings envSettings;

    //    #endregion

    //    #region Конструкторы

    //    /// <summary> Создать менеджер настроек. </summary>
    //    /// <param name="Engine"> Движок, используемый для доступа к настройкам. </param>
    //    internal SettingsManager(ZOVNPEngine Engine)
    //    {
    //        engine = Engine;
    //        envSettings = new EnvironmentSettings();
    //        systemSettings = new LazyLoader<ISettingCollection>(() => new SettingsCollection(engine, null, null, null));
    //        currentUserSettings = new LazyLoader<ISettingCollection>(() => GetUserSettings(engine.CurrentUser.Sid));
    //    }

    //    #endregion

    //    #region Свойства

    //    /// <summary> Получить настройки движка (общесистемные). </summary>
    //    public ISettingCollection SystemSettings { get { return systemSettings.Value; } }

    //    /// <summary> Получить настройки текущего пользователя. </summary>
    //    public ISettingCollection CurrentUserSettings { get { return currentUserSettings.Value; } }

    //    /// <summary> Настройки среды. </summary>
    //    public IEnvironmentSettings EnvironmentSettings { get { return envSettings; } }

    //    #endregion

    //    #region Методы

    //    /// <summary> Получение коллекции настроек заданного пользователя. </summary>
    //    /// <param name="UserSID"> Идентификатор безопасности требуемого пользователя. </param>
    //    /// <returns> Коллекция настроек. </returns>
    //    internal ISettingCollection GetUserSettings(byte[] UserSID) { return new SettingsCollection(engine, UserSID, null, null); }

    //    /// <summary> Получение коллекции специфических настроек заданного пользователя. </summary>
    //    /// <typeparam name="T"> Тип объекта, к которому относятся специфические настройки. </typeparam>
    //    /// <param name="UserSID">  Идентификатор безопасности требуемого пользователя. </param>
    //    /// <param name="ObjectInstanceID"> Идентификатор объекта. </param>
    //    /// <returns> Коллекция настроек. </returns>
    //    internal ISettingCollection GetCustomSettings<T>(byte[] UserSID, Guid ObjectInstanceID)
    //    {
    //        var attr = typeof(T).GetFirstAttribute<IdentityAttribute>();
    //        if (attr == null) throw new NotSupportedException(string.Format("Работа с настройками объектов типа {0} не подерживается.", typeof(T).Name));
    //        var obj = engine.Metadata.Objects[attr.Identity];
    //        if (obj == null) throw new NotSupportedException(string.Format("Не удалось определить идентификатор для типа {0}.", typeof(T).Name));
    //        return new SettingsCollection(engine, UserSID, obj.ID, ObjectInstanceID);
    //    }

    //    /// <summary> Получение коллекции специфических настроек текущего пользователя. </summary>
    //    /// <typeparam name="T"> Тип объекта, к которому относятся специфические настройки. </typeparam>
    //    /// <param name="ObjectInstanceID"> Идентификатор объекта, к которому относятся настройки. </param>
    //    /// <returns> Коллекция настроек. </returns>
    //    public ISettingCollection GetCurrentUserCustomSettings<T>(Guid ObjectInstanceID) { return GetCustomSettings<T>(engine.CurrentUser.Sid, ObjectInstanceID); }

    //    #endregion
    //}
}
